import torch

# 高级索引使用整数列表/张量或布尔张量来进行索引。
# 与基础切片不同，高级索引总是返回原始数据的一个副本 (Copy)，而不是视图。
# 修改副本不会影响原始张量。

t = torch.arange(12).reshape(3,4)
print(f"Original tensor:\n{t}\n")

# 选取第0行和第2行
rows_0_2 = t[[0, 2]] # 传入一个列表
print(f"Selecting rows 0 and 2:\n{rows_0_2}\n")

# 选取第3列和第1列
cols_3_1 = t[:,[3,1]]
print(f"Selecting columns 3 and 1:\n{cols_3_1}\n")

# 当给每个维度都提供一个索引列表时，它们会配对成坐标
# 下面的操作是选取 (0, 1) 和 (2, 3) 这两个位置的元素
# 而不是选取一个 2x2 的子矩阵
elements = t[[0,2],[1,3]]
print(f"Selecting elements at (0, 1) and (2, 3): {elements}\n")